package utils;

import java.util.*;

/**
 * 集合工具类
 */
public class CollectionUtil {

    /**
     * 集合转Set
     *
     * @param datum 数据
     * @param <E>   数据
     * @return set
     */
    public static <E> Set<E> toSet(Collection<E> datum) {
        if (datum == null || datum.isEmpty()) {
            return null;
        }

        Set<E> set = new HashSet<>(((int) (datum.size() / 0.75F)) + 1);
        for (E data : datum) {
            set.add(data);
        }
        return set;
    }


    /**
     * 集合转List
     *
     * @param datum 原始数据集
     * @param <E>   原始数据类型
     * @return 转换后的List数据集
     */
    public static <E> List<E> toList(Collection<E> datum) {
        if (datum == null || datum.isEmpty()) {
            return null;
        }

        List<E> list = new ArrayList<>(datum.size());
        for (E data : datum) {
            list.add(data);
        }
        return list;
    }


    /**
     * 集合转字符串
     *
     * @param datum     原始数据集
     * @param separator 分隔符
     * @param <E>       对象的类型
     * @return 转换后的String数据
     */
    public static <E> String toString(Collection<E> datum, String separator) {
        if (datum == null || datum.isEmpty()) {
            return null;
        }

        StringBuilder builder = new StringBuilder(5 * datum.size());
        String aSeparator = "";
        for (E data : datum) {
            builder.append(aSeparator);
            aSeparator = separator;
            builder.append(data);
        }

        return builder.toString();
    }

    /**
     * 给定集合c1和c2,求c1在c2中的相对补集(c2 - c1),即:c1中存在,但在c2中不存在的元素
     *
     * @param c1  集合1
     * @param c2  集合2
     * @param <E> 集合元素的数据类型
     * @return c1中存在, 但c2中不存在的元素集
     */
    public static <E> Collection<E> complement(Collection<E> c1, Collection<E> c2) {
        if (c2 == null || c2.isEmpty() || c1 == null || c1.isEmpty()) {
            return c1;
        }

        List<E> copy = new ArrayList<E>(c1.size());
        copy.addAll(c1);

        copy.removeAll(c2);
        return copy;
    }

    /**
     * 集合为null，或者不存在元素
     *
     * @param c 集合
     * @return 集合为null或者不存在元素为true，否则为false
     */
    public static boolean isEmpty(Collection c) {
        return c == null || c.isEmpty();
    }

    /**
     * 集合不为null，并且存在元素
     *
     * @param c 集合
     * @return 集合不为null并且存在元素为true，否则为false
     */
    public static boolean isNotEmpty(Collection c) {
        return !isEmpty(c);
    }

    /**
     * Map为null，或者不存在元素
     *
     * @param map 需要检查的Map
     * @return Map为null或者不存在元素为true，否则为false
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return (map == null || map.isEmpty());
    }
}
